﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Boggle
{
	class Program
	{
		static void Main(string[] args)
		{
			IBoggleDictionary dict = new AonaDictionary();

			BoggleGrid grid = new BoggleGrid
			(
				new Die[4, 4]
				{
					{
						new Die("a", "a", "e", "e", "g", "n"),
						new Die("e", "e", "g", "h", "n", "w"),
						new Die("e", "i", "o", "s", "s", "t"),
						new Die("a", "b", "b", "j", "o", "o")
					},
					{
						new Die("h", "l", "n", "n", "r", "z"),
						new Die("a", "o", "o", "t", "t", "w"),
						new Die("d", "i", "s", "t", "t", "y"),
						new Die("e", "e", "i", "n", "s", "u")
					},
					{
						new Die("d", "e", "l", "r", "v", "y"),
						new Die("a", "c", "h", "o", "p", "s"),
						new Die("c", "i", "m", "o", "t", "u"),
						new Die("e", "h", "r", "t", "v", "w")
					},
					{
						new Die("e", "l", "r", "t", "t", "y"),
						new Die("a", "f", "f", "k", "p", "s"),
						new Die("d", "e", "i", "l", "r", "x"),
						new Die("h", "i", "m", "n", "qu", "u")
					}
				}
			);

			while(true)
			{
				Console.WriteLine(grid);
				string word = Console.ReadLine();
				List<Die> wordDice = grid.ContainsWord(word);

				if (wordDice != null)
				{
					List<string> defs = dict.Define(word);

					if (defs.Count > 0)
					{
						defs.ForEach(def => Console.WriteLine(def));
						Console.WriteLine("{0} points!", Score(word));
					}
					else
					{
						Console.WriteLine("{0} is not a word!", word);
					}
				}
				else
				{
					Console.WriteLine("{0} is not in the grid!", word);
				}

				Console.WriteLine();
			}
		}

		static int Score(string word)
		{
			if (word == null)
			{
				throw new ArgumentNullException("word");
			}

			if (word.Length == 3 || word.Length == 4)
			{
				return 1;
			}
			if (word.Length == 5)
			{
				return 2;
			}
			if (word.Length == 6)
			{
				return 3;
			}
			if (word.Length == 7)
			{
				return 5;
			}
			if (word.Length > 7)
			{
				return 11;
			}

			return 0;
		}
	}
}
